package com.cskaoyan.javase.oop3._1interface._5extend;

/**
 * 学习完接口，抽象类以后
 * 方法的返回值类型以及它的具体返回值的数据类型
 *      如果返回值类型写接口和抽象类，那么必须返回它们的子类对象（因为它们自身不能new对象）
 *      如果返回值类型写一个普通类，那么可以返回它的对象，也可以返回它的子类对象
 *
 * 方法的形参数据类型以及它在调用时具体传入的实参的数据类型
 *      如果形参数据类型写接口和抽象类，那么调用方法时实参必须传入它们的子类对象（因为它们自身不能new对象）
 *      如果形参数据类型写一个普通类，那么调用方法时可以传入它的对象，也可以传入它的子类对象
 *
 * 方法重写中的父类方法的返回值类型和它子类重写方法的返回值类型问题
 *      如果父类方法返回一个父类类型，那么子类重写方法允许返回子类类型（当然也可以保持一致）
 *      其余返回值数据类型（基本数据类型，void）必须完全保持一致。
 *
 * @since 09:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test2(new BaseASon());
    }

    public static IA test() {
        return new IAImpl();
    }

    public static void test2(BaseA ba) {
    }

}

interface IA {
}

abstract class BaseA {
}

class IAImpl implements IA {
}

class BaseASon extends BaseA {
}

class Father {
    public Object test() {
        return null;
    }
}

class Son extends Father {
    @Override
    public int[] test() {
        return null;
    }
}